#ifndef __DATA_GLOBAL_H__
#define __DATA_GLOBAL_H__

/****************************************************
data_global.h

全局头文件定义
全局宏定义
全局设备节点声明
数据类型重定义
全局结构体声明
全局线程函数声明
全局消息队列发送函数声明
全局消息队列传递结构体声明
CRC校验方法声明

****************************************************/


/****************************************************
全局头文件定义
****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <syscall.h>
#include <termios.h>
#include <errno.h>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/input.h>


/****************************************************
全局宏定义
****************************************************/
#define MONITOR_NUM 2
#define HOME_ID 1
#define QUEUE_MSG_LEN 32
#define A9_MSG_SIZE 42
#define ZIGBEE_MSG_SIZE 38
#define ZBUF_SIZ 8

#define PERIOD_GET_BUF 1


/****************************************************
全局设备节点声明
****************************************************/
#define GPRS_DEV "/dev/ttyUSB1"
#define ZIGBEE_DEV "/dev/ttyUSB0"
#define BEEPER_DEV "/dev/fsbeeper0"
#define LED_DEV "/dev/fsled0"
#define ADC_DEV "/dev/fsadc0"
#define MPU6050_DEV "/dev/fsmpu60500"

/****************************************************
数据类型重定义
****************************************************/
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;


/****************************************************
全局结构体声明
****************************************************/

struct zbuf_t{
  int fan;
  int tem;
  int hum;
};

struct From_to_send{
	char recieve_phone[12];
	char center_phone[12];
};

struct makeru_zigbee_info{//zigbee的数据采集信息
    uint8_t head[3]; // 标识位："msm" makeru-security-monitor
    uint8_t type; //数据类型 'z'---zigbee   'a'---a9
    float temperature; //温度
    float humidity; //湿度
    float tempMIN; //温度下限
    float tempMAX; //温度上限
    float humidityMIN; //湿度下限
    float humidityMAX; //湿度上限
    uint32_t reserved[2]; //保留扩展位
};
//作为makeru_zigbee_info的备份结构体+CRC16校验
struct makeru_zigbee_crc16{
    uint8_t buffer[ZIGBEE_MSG_SIZE];  //makeru_zigbee_info的备份
    uint8_t crc[2];
};

struct makeru_a9_info{//A9自身的数据采集信息
    uint8_t head[3]; // 标识位："msm" makeru-security-monitor
    uint8_t type; //数据类型 'z'---zigbee   'a'---a9
    float adc;
    float gyrox; //陀螺仪数据
    float gyroy;
    float gyroz;
    float accx;  //加速度计数据
    float accy;
    float accz;
    uint32_t reserved[2]; //保留扩展位
};
//作为makeru_a9_info的备份结构体+CRC16校验
struct makeru_a9_crc16{
    uint8_t buffer[A9_MSG_SIZE];  //makeru_a9_info的备份
    uint8_t crc[2];
};

struct makeru_env_data{
    struct makeru_a9_crc16       a9_info;    
    struct makeru_zigbee_crc16   zigbee_info;
};

//所有监控区域的信息结构体
struct env_info_client_addr
{
    struct makeru_env_data  monitor_no[MONITOR_NUM];
};

//全局控制数据
struct makeru_ctrl_data {
    int ledstate;
    int beeperstate;
    int segstate;
    int fanstate;
};

//zigbee消息封装
struct zigbee_msg_t{
    char flag[3]; // "fan" or "hum"
    char type; // 'u' or 'd'
    int data1;
    int data2;
};

/****************************************************
全局外部线程函数声明
****************************************************/
extern void *pthread_client_request(void *arg); //接收CGI 等的请求
extern void *pthread_refresh(void *arg);  //刷新共享内存数据线程
extern void *pthread_sqlite(void *arg);   //数据库线程，保存数据库数据
extern void *pthread_transfer(void *arg); //接受ZigBee数据并解析
extern void *pthread_sms(void *arg);      //发送短信线程
extern void *pthread_buzzer(void *arg);   //蜂鸣器控制线程
extern void *pthread_led(void *arg);      //led灯控制线程


/****************************************************
全局消息队列发送函数声明
****************************************************/
extern int send_msg_queue(long type, unsigned char text);


/****************************************************
全局消息队列传递结构体声明
****************************************************/
struct msg{
    long type;
    long msgtype;
    uint8_t text[QUEUE_MSG_LEN];
};


/****************************************************
CRC校验方法声明
****************************************************/
#define CRC_H_INIT_VAL                  0xFF
#define CRC_L_INIT_VAL                  0xFF

uint16_t crc16(uint8_t *puchMsg, uint16_t usDataLen);   //计算CRC16的值
void crc16_set(uint8_t *buf, uint32_t len);             //设置CRC16的值
uint8_t crc16_check(uint8_t *buf, uint32_t len);        //校验CRC16的值是否正确


#endif